const defaultConfig = {
    /** 加载元素*/
    el: "",
    /** 树形菜单方向 可选值为 horizontal（水平） 和 vertical（垂直) 默认值为 vertical */
    mode: "vertical",
    /** 数据*/
    jsonArr: new Array(),
    /** 每条数据的主键字段*/
    selfIdField: "id",
    /** 每条数据的父级字段*/
    parentIdField: "parent",
    /** 第一级数据的父级id*/
    parentld: "",
    /** 需要显示的字段*/
    text: "text",
    /** 数据类型*/
    type: "list",
    /** 自定义整体视图class*/
    viewClass: "",
    /** 自定义单独项class*/
    itemClass: "",
    /**
     * 单击事件
     * @param itemId 当前节点id
     * @param itemData 当前节点所有数据
     * @param itemNode 当前节点Dom
     */
    click: (itemId: String, itemData: Object, itemNode: Element) => {}
};

/**
 * 是否是数组
 * @param val 需要判断的值
 * @returns {boolean}
 */
const isArray = (val: Array<any>): Boolean => {
    return toString.call(val) === "[object Array]";
};
/**
 * 是否是字符串
 * @param val
 * @returns {boolean}
 */
const isString = (val: String): Boolean => {
    return typeof val === "string";
};
/**
 * 去除字符串左右两边空格
 * @param {String} str 需要去除空格的字符串
 */
const trim = (str: String = ""): String => {
    return str.replace(/^\s*|\s*$/g, "");
};

/**
 * 递归遍历json 生成树形
 * @param jsonArr 需要遍历的json数组
 * @param selfIdField 每条数据id字段
 * @param parentIdField 每条数据父级id字段
 * @param parentld 最顶级 父级id值
 * @returns {[]|Array}
 */
const convertToTreeData = (
    jsonArr: Array<any> = [],
    selfIdField: string = "id",
    parentIdField: string = "parentId",
    parentld: string = ""
) => {
    let result = [];
    if (isArray(jsonArr) && isString(parentIdField)) {
        if (jsonArr.length < 1) {
            return [];
        } else {
            for (const val of jsonArr) {
                if (val[`${parentIdField}`] === parentld) {
                    
                    let obj:any = {};
                    for (const key in val) {
                        obj[`${key}`] = val[`${key}`];
                    }
                    let children = convertToTreeData(
                        jsonArr,
                        selfIdField,
                        parentIdField,
                        obj[`${selfIdField}`]
                    );

                    if (children.length > 0) {
                        obj.children = children;
                    }

                    result.push(obj);
                }
            }
        }
    } else {
        throw "传入参数格式不正确";
    }
    return result;
};

/**
 * 数组扁平化
 * @param {}} arr
 */
const flatten = (arr: Array<any>) => {
    let res: Array<any> = [];
    arr.forEach(item => {
        if (item.children && Array.isArray(item.children)) {
            res = res.concat(flatten(item.children));
            delete item.children;
            res.push(item);
        } else {
            res.push(item);
        }
    });
    return res;
};

export default {
    trim,
    isArray,
    isString,
    convertToTreeData,
    flatten,
    defaultConfig
};
